#include <opencv2/opencv.hpp>
#include <iostream>

// 定义全局变量
cv::Point pt1, pt2;
bool isDrawing = false;

// 鼠标回调函数
void mouseCallback(int event, int x, int y, int flags, void* userdata) {
    // 获取原始图像
    cv::Mat& image = *(cv::Mat*)userdata;
    cv::Mat tempImage = image.clone();  // 克隆原图来绘制动态矩形

    switch (event) {
        case cv::EVENT_LBUTTONDOWN: // 鼠标左键按下
            pt1 = cv::Point(x, y); // 获取鼠标按下时的位置
            isDrawing = true;
            break;
        case cv::EVENT_MOUSEMOVE: // 鼠标移动
            if (isDrawing) {
                pt2 = cv::Point(x, y); // 更新鼠标移动时的位置
                cv::rectangle(tempImage, pt1, pt2, cv::Scalar(0, 255, 0), 2); // 绘制矩形
                cv::imshow("Mouse Event Example", tempImage); // 显示绘制过程
            }
            break;
        case cv::EVENT_LBUTTONUP: // 鼠标左键松开
            pt2 = cv::Point(x, y); // 获取松开时的位置
            isDrawing = false;
            cv::rectangle(image, pt1, pt2, cv::Scalar(0, 255, 0), 2); // 绘制最终矩形
            cv::imshow("Mouse Event Example", image); // 显示最终图像
            break;
        default:
            break;
    }
}

int main() {
    // 创建一张空白图像
    cv::Mat image = cv::Mat::zeros(600, 800, CV_8UC3);

    // 创建窗口
    cv::namedWindow("Mouse Event Example");

    // 注册鼠标事件回调函数
    cv::setMouseCallback("Mouse Event Example", mouseCallback, &image);

    // 显示窗口
    cv::imshow("Mouse Event Example", image);

    // 按任意键退出
    cv::waitKey(0);
    return 0;
}
